home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Deutsche Edition 1
/
Deutsche Edition 1.iso
/
amok
/
081-090
/
amok90
/
bumprevmo1.0
/
bumprevmo.mod
< prev
next >
Wrap
Text File
|
1993-11-04
|
8KB
|
283 lines
(*(***********************************************************************
:Program. BumpRevMO.mod
:Contents. Revision bumper
:Author. Hartmut Goebel [hG]
:Address. Aufseßplatz 5, D-8500 Nürnberg 40
:Address. UseNet: hartmut@oberon.nbg.sub.org
:Address. Z-Netz: hartmut@asn.zer Fido: 2:246/81.1
:Copyright. Copyright © 1993 by Hartmut Goebel
:Language. Oberon-2
:Translator. Amiga Oberon 3.0
:Version. $VER: BumpRevMO.mod 1.0 (9.3.93)
(* $StackChk- $NilChk- $RangeChk- $CaseChk- $OvflChk- $ReturnChk- $ClearVars- *)
(****i* BumpRevMO.mod/--history-- ***************************************
*
*********************************************************************)*)*)
MODULE BumpRevMO;
(****** BumpRevMO ****************************************************(**
*
* NAME
* BumpRevMO -- updating revision module (xxxRev.mod and xxxRev.def)
*
* SYNOPSIS
* BumpRevMO Version/N/A,File/A,Modula/S
*
* FUNCTION
* This tools works like the bumprev tool on the developers disks,
* but outputs Modula-2 and Oberon source.
*
* It creates a new module with the tools name concated with
* "Rev", and (if not already existing) a revision file with the
* name of this module and extension ".rev".
*
* If the option Modula is set, then the program will create a
* proper Modula-2 definition module, else a Oberon module.
*
* If the txt/ sub-dir exists, the program will cd there and then
* try to open the needed file. This behavior should become more
* flexible in future to work like AmigaOberon and perhaps like
* M2Amiga.
*
* EXAMPLE
* shell-prompt> bumprev 17 foobar
* bumprev: creating new revision file
* bumprev: bumped foobar to revision 1
* shell-prompt> bumprev 17 foobar
* bumprev: bumped foobar to revision 2
*
* This has created the files foobarRev.mod and foobarRev.rev.
* foobarRev.mod looks like this:
* .....8<-------
* MODULE foobarRev;
* CONST
* version * = 17;
* revision * = 2;
* date * = '9.3.93';
* vers * = 'foobar 17.2';
* vString * = 'foobar 17.2 (9.3.93)\r\n';
* versTag * = '$VER: foobar 17.2 (9.3.93)\r\n';
*
* END foobarRev.
* .....8<-------
*
************)*)
IMPORT
d := Dos,
e := Exec,
ol := OberonLib,
Printf,
Timer,
u := Utility,
y := SYSTEM;
CONST
need20 = "I need at least AmigaDos 2.0\n";
version = "$VER: BumpRevMO 1.0 (9.3.93) [hG]";
template = "Version/N/A,File/A,Modula/S";
programName = "BumpRevMO";
newRevision = "%s: creating new revision file\n";
revisionBumped = "%s: bumped %s to revision %ld\n";
TYPE
argsType = STRUCT
version: POINTER TO ARRAY 1 OF LONGINT;
file: e.STRPTR;
modula: LONGINT;
END;
VAR
arguments: d.RDArgsPtr;
argv: argsType;
file: d.FileHandlePtr;
revision: LONGINT;
day,month,year: INTEGER;
thisDir, oldDir: d.FileLockPtr;
filename: e.STRING;
prgname: e.STRING;
PROCEDURE PrintFault();
BEGIN
IF d.PrintFault(d.IoErr(),prgname) THEN END;
HALT(20);
END PrintFault;
PROCEDURE GetDate;
VAR
timeReqPtr: Timer.TimeRequestPtr;
sysTime: Timer.TimeVal;
success: BOOLEAN;
clockData: u.ClockData;
BEGIN
success := FALSE;
NEW(timeReqPtr);
IF timeReqPtr # NIL THEN
IF e.OpenDevice(Timer.timerName,Timer.vBlank,timeReqPtr,LONGSET{}) = 0 THEN
Timer.base := timeReqPtr.node.device;
Timer.GetSysTime(sysTime);
e.CloseDevice(timeReqPtr);
success := TRUE;
END;
(* $IFNOT GarbageCollector *)
DISPOSE(timeReqPtr);
(* $END *)
END;
IF ~success THEN
HALT(20);
END;
u.Amiga2Date(sysTime.secs,clockData);
day := clockData.mday;
month := clockData.month;
year := clockData.year MOD 100; (* only two digits for the year :-( *)
END GetDate;
PROCEDURE BumpRevMOision(filename: ARRAY OF CHAR); (* $CopyArrays- *)
PROCEDURE Print(contents: ARRAY OF CHAR); (* $CopyArrays- *)
BEGIN
IF d.FPrintf(file,contents,
argv.file,
argv.version[0],
revision,
day,month,year,
argv.file,argv.version[0],revision,
argv.file,argv.version[0],revision,day,month,year,
argv.file,argv.version[0],revision,day,month,year,
argv.file)
< 0 THEN PrintFault;
END;
END Print;
CONST
modHead = "DEFINITION MODULE %sRev;\n"
"CONST\n"
" version = %ld;\n"
" revision = %ld;\n"
" date = '%ld.%ld.%ld';\n"
" vers = '%s %ld.%ld';\n"
" vString = '%s %ld.%ld (%ld.%ld.%ld)\\r\\n';\n"
" versTag = '$VER: %s %ld.%ld (%ld.%ld.%ld)\\r\\n';\n"
"\nEND %sRev.\n";
oberonHead = "MODULE %sRev;\n(* $Implementation- *)\n"
"CONST\n"
" version * = %ld;\n"
" revision * = %ld;\n"
" date * = '%ld.%ld.%ld';\n"
" vers * = '%s %ld.%ld';\n"
" vString * = '%s %ld.%ld (%ld.%ld.%ld)\\r\\n';\n"
" versTag * = '$VER: %s %ld.%ld (%ld.%ld.%ld)\\r\\n';\n"
"\nEND %sRev.\n";
BEGIN
file := d.Open(filename,d.newFile);
IF file = NIL THEN PrintFault; END;
IF argv.modula # d.DOSFALSE THEN
Print(modHead);
ELSE
Print(oberonHead);
END;
IF ~ d.Close(file) THEN
file := NIL;
PrintFault();
END;
file := NIL;
END BumpRevMOision;
PROCEDURE CheckTxtDir;
BEGIN
thisDir := d.Lock("txt",d.sharedLock);
IF thisDir # NIL THEN
oldDir := d.CurrentDir(thisDir);
ELSE
oldDir := NIL;
END;
END CheckTxtDir;
PROCEDURE ReadRevision(filename: ARRAY OF CHAR): BOOLEAN;
(* $CopyArrays- *)
VAR
rev: LONGINT;
buffer: ARRAY 50 OF CHAR;
BEGIN
file := d.Open(filename,d.oldFile);
IF file = NIL THEN
RETURN FALSE;
END;
IF d.FGets(file,buffer,SIZE(buffer)-1) = NIL THEN
(* IF ioerr = 0 no line read!! *)
PrintFault;
END;
IF d.StrToLong(buffer,rev) < 0 THEN
PrintFault; END;
revision := SHORT(rev);
d.OldClose(file);
file := NIL;
RETURN TRUE;
END ReadRevision;
PROCEDURE WriteRevision(filename: ARRAY OF CHAR); (* $CopyArrays- *)
VAR
rev: LONGINT;
BEGIN
file := d.Open(filename,d.newFile);
IF file = NIL THEN PrintFault; END;
IF d.FPrintf(file,"%ld",revision) < 0 THEN
PrintFault; END;
IF ~ d.Close(file) THEN
file := NIL;
PrintFault();
END;
file := NIL;
END WriteRevision;
PROCEDURE MakeFileName(VAR buffer: ARRAY OF CHAR; name, extension: ARRAY OF CHAR);
(* $CopyArrays- *)
BEGIN
Printf.SPrintf2(buffer,"%s%s",y.ADR(name),y.ADR(extension));
END MakeFileName;
BEGIN
IF ol.wbStarted THEN HALT(20); END; (* WB, what's THAT? :-) *)
IF d.dos.lib.version < 36 THEN
IF d.Write(d.Output(),need20,SIZE(need20)) = 0 THEN END;
HALT(20);
END;
prgname := version;
IF ~ d.GetProgramName(prgname,30) THEN prgname := programName END;
arguments := d.ReadArgs(template,argv,NIL);
IF arguments = NIL THEN
PrintFault;
END;
GetDate;
CheckTxtDir;
MakeFileName(filename,argv.file^,"Rev.rev");
IF ~ReadRevision(filename) THEN
IF d.FPrintf(d.Output(),newRevision,y.ADR(prgname)) = 0 THEN END;
revision := 0;
END;
INC(revision);
WriteRevision(filename);
IF d.FPrintf(d.Output(),revisionBumped,y.ADR(prgname),argv.file,revision) = 0 THEN END;
MakeFileName(filename,argv.file^,"Rev.mod");
BumpRevMOision(filename);
CLOSE
IF file # NIL THEN d.OldClose(file); END;
IF oldDir # NIL THEN
IF d.CurrentDir(oldDir) = NIL THEN END;
END;
IF thisDir # NIL THEN d.UnLock(thisDir); END;
END BumpRevMO.